﻿#include<iostream>
using namespace std;
class A
{
public:
	A(int a = 0)
		:_a1(a)
	{
		cout << "A(int a)" << endl;
	}
	A(const A& aa)
		:_a1(aa._a1)
	{
		cout << "A(const A& aa)" << endl;
	}
	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a1 = aa._a1;
		}
		return *this;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a1 = 1;
};
void f1(A aa)
{}
A f2()
{
	A aa;
	return aa;
}
int main()
{
// 传值返回
// 返回时⼀个表达式中，连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 （vs2019）
// ⼀些编译器会优化得更厉害，进⾏跨⾏合并优化，直接变为构造。（vs2022）
	f2();
	cout << endl;
// 返回时⼀个表达式中，连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 （vs2019）
	
// ⼀些编译器会优化得更厉害，进⾏跨⾏合并优化，直接变为构造。（vs2022）
//这里再vs2022下直接把构造和两个拷贝构造直接变为直接构造aa2
//也就是这里的临时对象和aa都被优化了因此这里没有析构
		A aa2 = f2();
	 cout << endl;
	
// ⼀个表达式中，连续拷⻉构造+赋值重载->⽆法优化
	 A aa1;//构造
	aa1 = f2(); //先构造aa在拷贝构造临时对象
				//最后赋值重载
				//注意这里有一个小优化这里把构造aa在拷贝构造临时对象
				//直接优化成了直接构造临时对象
				//因此这里的析构是析构临时对象的相当于aa就没有
	 cout << endl;
	return 0;
}